<?php
/**
 * 获取数据库中所有视图的名称
 * @return array 视图名称数组
 */
function getAllViews() {
    $conn = getDbConnection();
    if (!$conn) {
        return array();
    }
    
    // 查询所有视图
    $sql = "SHOW FULL TABLES WHERE table_type = 'VIEW'";
    $result = $conn->query($sql);
    
    $views = array();
    if ($result && $result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            // 提取视图名称（数组中的第一个值）
            $views[] = reset($row);
        }
    }
    
    $conn->close();
    return $views;
}

/**
 * 根据表名获取中文表名（从表的comment中获取）
 * @param string $table_name 表名
 * @return string 中文表名或原表名
 */
function getChineseTableName2($table_name) {
    $conn = getDbConnection();
    if (!$conn) {
        return $table_name;
    }
    
    // 安全转义表名
    $safe_table_name = $conn->real_escape_string($table_name);
    
    // 查询表的comment
    $sql = "SELECT table_comment FROM information_schema.tables 
            WHERE table_schema = DATABASE() AND table_name = '$safe_table_name'";
    $result = $conn->query($sql);
    
    $comment = $table_name; // 默认返回表名
    if ($result && $result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $table_comment = $row['table_comment'];
        if (!empty($table_comment)) {
            $comment = $table_comment;
        }
    }
    
    $conn->close();
    return $comment;
}

// 引入配置文件
require_once 'config.php';
/**
 * 创建文件并确保目录存在
 * @param string $file_path 要创建的文件路径（包含文件名）
 * @param string $content 要写入的内容
 * @return bool 成功返回true，失败返回false
 */
function writeToFile($file_path, $content) {
    // 检查目录是否存在，不存在则创建
    $dir = dirname($file_path);
    if (!is_dir($dir)) {
        // 递归创建目录，设置权限为0755
        if (!mkdir($dir, 0755, true)) {
            error_log("无法创建目录: {$dir}");
            return false;
        }
    }
    
    // 写入内容（如果文件不存在会自动创建）
    if (file_put_contents($file_path, $content, FILE_APPEND) === false) {
        error_log("无法写入文件: {$file_path}");
        return false;
    }
    
    return true;
}

/**
 * 记录SQL日志到文件
 * @param string $sql 要记录的SQL语句
 */
function logSqlQuery($sql) {
    $current_time = date('Y-m-d H:i:s');
    $log_content = "{$current_time}: {$sql}\n";
    $log_file = __DIR__ . '/logs.txt'; // 日志文件路径，与当前脚本同目录
    
    // 调用创建文件函数（自动处理文件不存在的情况）
    writeToFile($log_file, $log_content);
}
/**
 * 获取分页数据
 * @param string $table_name 表名
 * @param int $page 当前页码
 * @param int $page_size 每页显示数量
 * @param string $order_by 排序字段
 * @param string $order_dir 排序方向
 * @return array 包含数据和分页信息的数组
 */
function getPagedData($table_name, $page = 1, $page_size = 10, $order_by = null, $order_dir = 'ASC') {
    // 添加调试日志
    $log = "[" . date('Y-m-d H:i:s') . "] 调用getPagedData - 表名: $table_name, 页码: $page, 每页大小: $page_size\n";
    
    $conn = getDbConnection();
    if (!$conn) {
        $log .= "数据库连接失败\n";
        file_put_contents('d:\\phpstudy_pro\\WWW\\dbautosite\\delete_debug.log', $log, FILE_APPEND);
        return array(
            'data' => array(),
            'total' => 0,
            'total_pages' => 0,
            'current_page' => $page,
            'page_size' => $page_size
        );
    }
    
    // 安全转义表名和排序参数
    $log .= "[" . date('Y-m-d H:i:s') . "] 转义前表名: $table_name\n";
    $safe_table_name = $conn->real_escape_string($table_name);
    $log .= "[" . date('Y-m-d H:i:s') . "] 转义后表名: $safe_table_name\n";
    $safe_order_by = $conn->real_escape_string($order_by);
    $safe_order_dir = strtoupper($order_dir) === 'DESC' ? 'DESC' : 'ASC'; // 限制排序方向为ASC或DESC
    
    // 确保页码和每页数量为正整数
    $page = max(1, intval($page));
    $page_size = max(1, min(100, intval($page_size))); // 限制每页数量在1-100之间
    
    // 计算偏移量
    $offset = ($page - 1) * $page_size;
    
    // 获取总记录数
    $count_sql = "SELECT COUNT(*) as total FROM $safe_table_name";
    $count_result = $conn->query($count_sql);
    
    if (!$count_result) {
        $conn->close();
        return array(
            'data' => array(),
            'total' => 0,
            'total_pages' => 0,
            'current_page' => $page,
            'page_size' => $page_size
        );
    }
    
    $count_row = $count_result->fetch_assoc();
    $total = $count_row['total'];
    
    // 计算总页数
    $total_pages = ceil($total / $page_size);    
    // 获取分页数据
    // 检查排序字段是否存在
    $fields = getTableFields($table_name);
    if ($order_by === null || !in_array($safe_order_by, $fields)) {
        // 获取表的主键作为默认排序字段
        $primary_keys = getTablePrimaryKeys($table_name);
        if (!empty($primary_keys)) {
            // 处理复合主键的情况
            $safe_order_by = implode(', ', $primary_keys);
        } else {
            // 如果没有主键，使用第一个字段
            $safe_order_by = count($fields) > 0 ? $fields[0] : 'id';
        }
    }
    
    $data_sql = "SELECT * FROM $safe_table_name ORDER BY $safe_order_by $safe_order_dir LIMIT $offset, $page_size";
    logSqlQuery($data_sql);
    $data_result = $conn->query($data_sql);
    
    if (!$data_result) {
        $data = array();
    } else {
        $data = array();
        while ($row = $data_result->fetch_assoc()) {
            $data[] = $row;
        }
    }
    
    $conn->close();
    
  
    return array(
        'data' => $data,
        'total' => $total,
        'total_pages' => $total_pages,
        'current_page' => $page,
        'page_size' => $page_size
    );
}

/**
 * 获取单条记录
 * @param string $table_name 表名
 * @param mixed $id 记录ID（可以是单一值或关联数组，对于复合主键使用关联数组）
 * @return array|null 记录数据或null
 */
function getRecordById($table_name, $id) {
    $conn = getDbConnection();
    
    // 安全转义表名
    $safe_table_name = $conn->real_escape_string($table_name);
    
    // 获取主键字段名
    $primary_keys = getTablePrimaryKeys($table_name);
    if (empty($primary_keys)) {
        $conn->close();
        return null;
    }
    
    // 构建WHERE条件
    $where_conditions = array();
    if (is_array($id) && count($id) > 1) {
        // 复合主键情况
        foreach ($primary_keys as $pk) {
            if (isset($id[$pk])) {
                $safe_value = $conn->real_escape_string($id[$pk]);
                $where_conditions[] = "$pk = '$safe_value'";
            }
        }
    } else {
        // 单主键情况
        $pk = $primary_keys[0];
        $safe_value = is_array($id) ? $conn->real_escape_string($id[$pk]) : $conn->real_escape_string($id);
        $where_conditions[] = "$pk = '$safe_value'";
    }
    
    if (empty($where_conditions)) {
        $conn->close();
        return null;
    }
    
    $where_clause = implode(' AND ', $where_conditions);
    $sql = "SELECT * FROM $safe_table_name WHERE $where_clause";
    logSqlQuery($sql);
    $result = $conn->query($sql);
    
    if ($result && $result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $conn->close();
        return $row;
    } else {
        $conn->close();
        return null;
    }
}

/**
 * 添加新记录
 * @param string $table_name 表名
 * @param array $data 记录数据
 * @return int|false 新记录ID或false
 */
function addRecord($table_name, $data) {
    $conn = getDbConnection();
    
    // 安全转义表名
    $safe_table_name = $conn->real_escape_string($table_name);
    
    // 过滤并转义数据
    $fields = array();
    $values = array();
    foreach ($data as $field => $value) {
        // 跳过空值
        if ($value === null || $value === '') continue;
        
        $fields[] = $conn->real_escape_string($field);
        $values[] = "'" . $conn->real_escape_string($value) . "'";
    }
    
    // 构建SQL
    $fields_str = implode(', ', $fields);
    $values_str = implode(', ', $values);
    $sql = "INSERT INTO $safe_table_name ($fields_str) VALUES ($values_str)";
    logSqlQuery($sql);
    if ($conn->query($sql) === TRUE) {
        $last_id = $conn->insert_id;
        $conn->close();
        return $last_id;
    } else {
        $conn->close();
        return false;
    }
}

/**
 * 更新记录
 * @param string $table_name 表名
 * @param mixed $id 记录ID（可以是单一值或关联数组，对于复合主键使用关联数组）
 * @param array $data 新数据
 * @return bool 是否成功
 */
function updateRecord($table_name, $id, $data) {
    $conn = getDbConnection();
    
    // 安全转义表名
    $safe_table_name = $conn->real_escape_string($table_name);
    
    // 获取主键字段名
    $primary_keys = getTablePrimaryKeys($table_name);
    if (empty($primary_keys)) {
        $conn->close();
        return false;
    }
    
    // 构建WHERE条件
    $where_conditions = array();
    if (is_array($id) && count($id) > 1) {
        // 复合主键情况
        foreach ($primary_keys as $pk) {
            if (isset($id[$pk])) {
                $safe_value = $conn->real_escape_string($id[$pk]);
                $where_conditions[] = "$pk = '$safe_value'";
            }
        }
    } else {
        // 单主键情况
        $pk = $primary_keys[0];
        $safe_value = is_array($id) ? $conn->real_escape_string($id[$pk]) : $conn->real_escape_string($id);
        $where_conditions[] = "$pk = '$safe_value'";
    }
    
    if (empty($where_conditions)) {
        $conn->close();
        return false;
    }
    
    // 构建更新语句
    $updates = array();
    foreach ($data as $field => $value) {
        // 跳过主键和空值
        if (in_array($field, $primary_keys) || $value === null) continue;
        
        $safe_field = $conn->real_escape_string($field);
        if ($value === '') {
            $updates[] = "$safe_field = NULL";
        } else {
            $safe_value = "'" . $conn->real_escape_string($value) . "'";
            $updates[] = "$safe_field = $safe_value";
        }
    }
    
    if (empty($updates)) {
        $conn->close();
        return true; // 没有需要更新的字段
    }
    
    $updates_str = implode(', ', $updates);
    $where_clause = implode(' AND ', $where_conditions);
    $sql = "UPDATE $safe_table_name SET $updates_str WHERE $where_clause";
    logSqlQuery($sql);
    if ($conn->query($sql) === TRUE) {
        $conn->close();
        return true;
    } else {
        $conn->close();
        return false;
    }
}

/**
 * 删除记录
 * @param string $table_name 表名
 * @param mixed $id 记录ID（可以是单一值或关联数组，对于复合主键使用关联数组）
 * @return bool 是否成功
 */
function deleteRecord($table_name, $id) {
    $conn = getDbConnection();
    
    // 添加调试日志
    $log = "[" . date('Y-m-d H:i:s') . "] 调用deleteRecord - 表名: $table_name\n";
    $log .= "主键参数: " . print_r($id, true) . "\n";
    
    // 安全转义表名
    $safe_table_name = $conn->real_escape_string($table_name);
    $log .= "转义后表名: $safe_table_name\n";
    
    // 获取主键字段名
    $primary_keys = getTablePrimaryKeys($table_name);
    $log .= "主键字段: " . implode(', ', $primary_keys) . "\n";
    
    if (empty($primary_keys)) {
        $log .= "未找到主键字段\n";
        $conn->close();
        file_put_contents('d:\\phpstudy_pro\\WWW\\dbautosite\\delete_debug.log', $log, FILE_APPEND);
        return false;
    }
    
    // 构建WHERE条件
    $where_conditions = array();
    if (is_array($id) && count($id) > 1) {
        // 复合主键情况
        foreach ($primary_keys as $pk) {
            if (isset($id[$pk])) {
                $safe_value = $conn->real_escape_string($id[$pk]);
                $where_conditions[] = "$pk = '$safe_value'";
                $log .= "WHERE条件: $pk = '$safe_value'\n";
            }
        }
    } else {
        // 单主键情况
        $pk = $primary_keys[0];
        $safe_value = is_array($id) ? $conn->real_escape_string($id[$pk]) : $conn->real_escape_string($id);
        $where_conditions[] = "$pk = '$safe_value'";
        $log .= "WHERE条件: $pk = '$safe_value'\n";
    }
    
    if (empty($where_conditions)) {
        $log .= "未构建WHERE条件\n";
        $conn->close();
        file_put_contents('d:\\phpstudy_pro\\WWW\\dbautosite\\delete_debug.log', $log, FILE_APPEND);
        return false;
    }
    
    $where_clause = implode(' AND ', $where_conditions);
    $sql = "DELETE FROM $safe_table_name WHERE $where_clause";
    logSqlQuery($sql);
    
    if ($conn->query($sql) === TRUE) {
        $conn->close();
        return true;
    } else {
        $conn->close();
        return false;
    }
}

/**
 * 获取表的所有主键字段名
 * @param string $table_name 表名
 * @return array 主键字段名数组
 */
function getTablePrimaryKeys($table_name) {
    $conn = getDbConnection();
    
    // 安全转义表名
    $safe_table_name = $conn->real_escape_string($table_name);
    
    $sql = "DESCRIBE $safe_table_name";
    $result = $conn->query($sql);
    
    if (!$result) {
        $conn->close();
        return array();
    }
    
    $primary_keys = array();
    while ($row = $result->fetch_assoc()) {
        if ($row['Key'] == 'PRI') {
            $primary_keys[] = $row['Field'];
        }
    }
    
    $conn->close();
    return $primary_keys;
}

/**
 * 获取表的主键字段名（兼容旧版本，只返回第一个主键）
 * @param string $table_name 表名
 * @return string|null 主键字段名或null
 */
function getPrimaryKey($table_name) {
    $primary_keys = getTablePrimaryKeys($table_name);
    return !empty($primary_keys) ? $primary_keys[0] : null;
}

/**
 * 获取表的所有字段名
 * @param string $table_name 表名
 * @return array 字段名数组
 */
function getTableFields($table_name) {
    $conn = getDbConnection();
    
    // 安全转义表名
    $safe_table_name = $conn->real_escape_string($table_name);
    $sql = "DESCRIBE $safe_table_name";
    $result = $conn->query($sql);
    
    $fields = array();
    while ($row = $result->fetch_assoc()) {
        $fields[] = $row['Field'];
    }
    
    $conn->close();
    return $fields;
}

/**
 * 获取分页数据（支持搜索）
 * @param string $table_name 表名
 * @param int $page 当前页码
 * @param int $page_size 每页显示数量
 * @param array $search_conditions 搜索条件数组
 * @return array 包含数据和分页信息的数组
 */
function getPagedDataWithSearch($table_name, $page, $page_size, $search_conditions = array()) {
    $conn = getDbConnection();
    
    if (!$conn) {
        return array(
            'data' => array(),
            'total' => 0,
            'total_pages' => 0,
            'current_page' => $page,
            'page_size' => $page_size
        );
    }

    // 安全转义表名
    $safe_table_name = $conn->real_escape_string($table_name);

    // 确保页码和每页数量为正整数
    $page = max(1, intval($page));
    $page_size = max(1, min(100, intval($page_size))); // 限制每页数量在1-100之间

    // 计算偏移量
    $offset = ($page - 1) * $page_size;

    // 构建WHERE子句
    $where_clause = '';
    if (!empty($search_conditions)) {
        $where_clause = 'WHERE ';
        $first_condition = true;
        foreach ($search_conditions as $condition) {
            $safe_field = $conn->real_escape_string($condition['field']);
            $safe_operator = $condition['operator'];
            $safe_value = $conn->real_escape_string($condition['value']);

            // 处理LIKE操作符的特殊情况
            if ($safe_operator === 'LIKE' || $safe_operator === 'NOT LIKE') {
                $safe_value = '\'' . '%' . $safe_value . '%' . '\'';
            } else {
                $safe_value = '\'' . $safe_value . '\'';
            }

            if ($first_condition) {
                $where_clause .= $safe_field . ' ' . $safe_operator . ' ' . $safe_value;
                $first_condition = false;
            } else {
                $logic = isset($condition['logic']) ? $condition['logic'] : 'AND';
                $where_clause .= ' ' . $logic . ' ' . $safe_field . ' ' . $safe_operator . ' ' . $safe_value;
            }
        }
    }

    // 获取总记录数
    $count_sql = 'SELECT COUNT(*) as total FROM ' . $safe_table_name . ' ' . $where_clause;
    $count_result = $conn->query($count_sql);

    if (!$count_result) {
        $conn->close();
        return array(
            'data' => array(),
            'total' => 0,
            'total_pages' => 0,
            'current_page' => $page,
            'page_size' => $page_size
        );
    }

    $count_row = $count_result->fetch_assoc();
    $total = $count_row['total'];

    // 计算总页数
    $total_pages = ceil($total / $page_size);

    // 获取表的主键作为默认排序字段
    if(isView($conn, $table_name)){
        // 如果是视图，获取视图配置
        $viewConfig = include 'view_names.php';
        if (isset($viewConfig[$table_name]['primary_keys'])) {
            // 如果设置了primary_keys，且是关联数组，取key作为结果
            $primaryKeysConfig = $viewConfig[$table_name]['primary_keys'];
            if (is_array($primaryKeysConfig)) {
                $primary_keys = array_keys($primaryKeysConfig);
            } else {
                $primary_keys = (array)$primaryKeysConfig;
            }
        } else {
            // 如果没有设置primary_keys，获取该视图的主表，再获取主表的主键
            if (isset($viewConfig[$table_name]['base_tables']) && !empty($viewConfig[$table_name]['base_tables'])) {
                $main_table = $viewConfig[$table_name]['base_tables'][0];
                $primary_keys = getTablePrimaryKeys($main_table);
            }
        }
    }
    else{
        $primary_keys = getTablePrimaryKeys($table_name);
    }
    if(empty($primary_keys)){
         $data_sql = 'SELECT * FROM ' . $safe_table_name . ' ' . $where_clause . ' LIMIT ' . $offset . ', ' . $page_size;
   
    }
    else{
        $order_by = !empty($primary_keys) ? implode(', ', $primary_keys) : 'id';
        $order_dir = 'ASC';
         $data_sql = 'SELECT * FROM ' . $safe_table_name . ' ' . $where_clause . ' ORDER BY ' . $order_by . ' ' . $order_dir . ' LIMIT ' . $offset . ', ' . $page_size;
    
    }
    
    logSqlQuery($data_sql);
    $data_result = $conn->query($data_sql);

    if (!$data_result) {
        $data = array();
    } else {
        $data = array();
        while ($row = $data_result->fetch_assoc()) {
            $data[] = $row;
        }
    }

    $conn->close();

    return array(
        'data' => $data,
        'total' => $total,
        'total_pages' => $total_pages,
        'current_page' => $page,
        'page_size' => $page_size
    );
}

/**
 * 获取数据库中表的实际大小写名称
 * @param string $table_name 表名（可能是小写）
 * @return string 表的实际大小写名称
 */
function getActualTableName($table_name) {
    $conn = getDbConnection();
    $safe_table_name = $conn->real_escape_string(strtolower($table_name));
    // 获取数据库配置
    global $db_configs;
    $default_config = $db_configs[DEFAULT_CONFIG_ID];
    $db_name = $default_config['dbname'];
    
    $sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
            WHERE TABLE_SCHEMA = '" . $db_name . "' AND LOWER(TABLE_NAME) = '$safe_table_name'";
    $result = $conn->query($sql);
    if ($result && $result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $conn->close();
        return $row['TABLE_NAME'];
    }
    
    $conn->close();
    return $table_name; // 如果没找到，返回原始名称
}

/**
 * 获取数据库中列的实际大小写名称
 * @param string $table_name 表名
 * @param string $column_name 列名（可能是小写）
 * @return string 列的实际大小写名称
 */
function getActualColumnName($table_name, $column_name) {
    $conn = getDbConnection();
    // 获取数据库配置
    global $db_configs;
    $default_config = $db_configs[DEFAULT_CONFIG_ID];
    $db_name = $default_config['dbname'];

    $safe_table_name = $conn->real_escape_string($table_name);
    $safe_column_name = $conn->real_escape_string(strtolower($column_name));
    
    $sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
            WHERE TABLE_SCHEMA = '" . $db_name . "'
              AND TABLE_NAME = '$safe_table_name'
              AND LOWER(COLUMN_NAME) = '$safe_column_name'";
    
    $result = $conn->query($sql);
    if ($result && $result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $conn->close();
        return $row['COLUMN_NAME'];
    }
    
    $conn->close();
    return $column_name; // 如果没找到，返回原始名称
}

/**
 * 生成外键下拉列表选项
 * @param string $referenced_table 引用表名
 * @param string $referenced_column 引用列名
 * @param mixed $selected_value 当前选中的值（可选）
 * @return string 生成的<option>标签HTML
 */
function generateSelectOptions($referenced_table, $referenced_column, $selected_value = null) {
    // 调试日志
    $conn = getDbConnection();
    
    // 获取实际的表名和列名大小写
    $actual_table_name = getActualTableName($referenced_table);
    $actual_column_name = getActualColumnName($actual_table_name, $referenced_column);
    
   
    // 安全转义表名和列名
    $safe_table_name = $conn->real_escape_string($actual_table_name);
    $safe_column_name = $conn->real_escape_string($actual_column_name);
    
    // 查询引用表的数据
    $sql = "SELECT * FROM $safe_table_name ORDER BY $safe_column_name ASC";
    logSqlQuery($sql);
    $result = $conn->query($sql);
    
    $options = '';
    
    // 获取表的所有字段名（用于查找合适的显示字段）
    $fields = array();
    if ($result && $result->num_rows > 0) {
        $fields = array_keys($result->fetch_assoc());
        // 重置结果指针
        $result->data_seek(0);
        
        while ($row = $result->fetch_assoc()) {
            // 使用实际列名获取值
            $value = $row[$actual_column_name];
            $label = $value;
            
            // 通用逻辑：智能查找适合显示的字段
            // 1. 尝试使用表名相关的名称字段（保留原始大小写）
            $singular_table = rtrim($referenced_table, 's'); // 不移除大小写
            $possible_name_fields = array(
                $singular_table . 'name',
                $singular_table . '_name',
                $singular_table . 'Name',
                'name',
                'title',
                'description',
                'label'
            );
            
            // 首先尝试精确匹配（区分大小写）
            foreach ($possible_name_fields as $field) {
                if (isset($row[$field]) && !empty($row[$field])) {
                    $label = $value . ' - ' . $row[$field];
                    break;
                }
            }
            
            // 如果没有找到，再尝试大小写不敏感匹配
            if ($label == $value) {
                $lowercase_fields = array_map('strtolower', $fields);
                foreach ($possible_name_fields as $field) {
                    $field_index = array_search(strtolower($field), $lowercase_fields);
                    if ($field_index !== false) {
                        $actual_field_name = $fields[$field_index];
                        if (isset($row[$actual_field_name]) && !empty($row[$actual_field_name])) {
                            $label = $value . ' - ' . $row[$actual_field_name];
                            break;
                        }
                    }
                }
            }
            
            // 检查是否选中
            $selected = ($selected_value !== null && $value == $selected_value) ? ' selected' : '';
            
            $options .= "<option value=\"$value\"$selected>$label</option>\n";
        }
    }
    
    $conn->close();
    return $options;
}
/**
 * 检查表是否为视图
 */
function isView($conn, $table_name) {
    $safe_table = $conn->real_escape_string($table_name);
    $sql = "SELECT TABLE_TYPE FROM INFORMATION_SCHEMA.TABLES 
            WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '$safe_table'";
    $result = $conn->query($sql);
    
    if (!$result) {
        error_log("检查视图失败（{$table_name}）：" . $conn->error);
        return false;
    }
    
    $row = $result->fetch_assoc();
    $isView = ($row && strtoupper($row['TABLE_TYPE']) === 'VIEW');
    $result->free();
    
    return $isView;
}

/**
 * 清理视图定义
 */
function cleanViewDefinition($definition) {
    // 移除所有注释
    $definition = preg_replace('/\/\*.*?\*\//s', ' ', $definition);
    $definition = preg_replace('/--.*$/m', ' ', $definition);
    // 移除特殊字符（保留字母、数字、括号、引号、空格和点号）
    $definition = preg_replace('/[^\w`\'()\s.=,]/', ' ', $definition);
    // 合并空格
    $definition = preg_replace('/\s+/', ' ', $definition);
    return trim(strtoupper($definition));
}

/**
 * 提取FROM后的表名，彻底清除引号和数据库前缀
 */
function extractFromTables($clean_def, $view_name) {
    $tables = [];
    $pos = 0;
    $len = strlen($clean_def);
    $from_str = 'FROM';
    $from_len = strlen($from_str);

    while (($pos = strpos($clean_def, $from_str, $pos)) !== false) {
        error_log("视图{$view_name}在位置{$pos}找到FROM");
        $pos += $from_len;

        // 跳过空格和括号
        while ($pos < $len) {
            $char = $clean_def[$pos];
            if ($char === ' ' || $char === '(') {
                $pos++;
            } else {
                break;
            }
        }

        // 提取完整表名（可能包含引号和数据库前缀）
        $table_end = $pos;
        while ($table_end < $len) {
            $char = $clean_def[$table_end];
            if (ctype_alnum($char) || $char === '_' || $char === '`' || $char === "'" || $char === '.') {
                $table_end++;
            } else {
                break;
            }
        }

        // 截取并处理表名
        $full_table = substr($clean_def, $pos, $table_end - $pos);
        
        // 彻底清除所有单引号和反引号
        $full_table = str_replace(['`', "'"], '', $full_table);
        
        // 分割数据库名和表名（处理db.table格式）
        $parts = explode('.', $full_table);
        $table_name = end($parts); // 取最后一部分作为表名
        $table_name = strtolower(trim($table_name));

        if (!empty($table_name)) {
            // 记录提取结果
            if (count($parts) > 1) {
                error_log("视图{$view_name}提取到跨库表：数据库=" . $parts[0] . "，表名={$table_name}");
            } else {
                error_log("视图{$view_name}提取到表名：{$table_name}");
            }
            $tables[] = $table_name;
        }

        $pos = $table_end;
    }

    return $tables;
}

/**
 * 获取视图中所有FROM后出现的基表（清理引号）
 */
function getViewBaseTables($view_name) {
    // 引入视图配置
    $viewConfig = include 'view_names.php';

    // 优先检查视图基本表映射
    if (isset($viewConfig[$view_name]) && isset($viewConfig[$view_name]['base_tables'])) {
        error_log("视图{$view_name}找到基本表映射：" . implode(', ', $viewConfig[$view_name]['base_tables']));
        return $viewConfig[$view_name]['base_tables'];
    }

    $conn = getDbConnection();
    if (!$conn) {
        error_log("数据库连接失败，无法处理视图{$view_name}");
        return [];
    }

    $safeViewName = $conn->real_escape_string($view_name);
    $baseTables = [];

    try {
        // 查询视图定义
        $sql = "SELECT VIEW_DEFINITION FROM INFORMATION_SCHEMA.VIEWS 
                WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '{$safeViewName}'";
        $result = $conn->query($sql);

        if (!$result) {
            throw new Exception("查询视图定义失败：" . $conn->error);
        }

        if ($result->num_rows === 0) {
            error_log("视图{$view_name}不存在于当前数据库");
            $conn->close();
            return [];
        }

        // 提取并清理视图定义
        $row = $result->fetch_assoc();
        $viewDefinition = $row['VIEW_DEFINITION'];
        $result->free();
        
        $cleanDef = cleanViewDefinition($viewDefinition);
        error_log("视图{$view_name}清理后定义：{$cleanDef}");

        // 提取表名（清理引号）
        $fromTables = extractFromTables($cleanDef, $view_name);
        
        if (empty($fromTables)) {
            error_log("视图{$view_name}的FROM后未发现任何表名！");
            $conn->close();
            return [];
        }

        // 处理嵌套视图
        $finalTables = [];
        foreach ($fromTables as $table) {
            if (isView($conn, $table)) {
                error_log("表{$table}是视图，递归提取");
                $nestedTables = getViewBaseTables($table);
                $finalTables = array_merge($finalTables, $nestedTables);
            } else {
                $finalTables[] = $table;
            }
        }

        // 去重并保留顺序
        $seen = [];
        $uniqueTables = [];
        foreach ($finalTables as $t) {
            if (!in_array($t, $seen)) {
                $seen[] = $t;
                $uniqueTables[] = $t;
            }
        }
        $baseTables = $uniqueTables;

    } catch (Exception $e) {
        error_log("处理视图{$view_name}时出错：" . $e->getMessage());
        $baseTables = [];
    }

    $conn->close();
    error_log("视图{$view_name}最终提取的基表：" . implode(', ', $baseTables));
    
    return $baseTables;
}
/**
 * 根据视图名获取主表主键
 * @param string $view_name 视图名
 * @return array 主键字段名数组
 */
function getPrimaryKeysByView($view_name) {
    // 引入视图配置文件
    $viewConfig = require 'view_names.php';
    
    // 调试信息
    if (!isset($viewConfig)) {
        error_log('getPrimaryKeysByView: $viewConfig is not set');
        return array();
    }
    
    if (!is_array($viewConfig)) {
        error_log('getPrimaryKeysByView: $viewConfig is not an array');
        return array();
    }
    
    // 检查配置文件中是否有该视图的primary_keys映射
    if (isset($viewConfig[$view_name]['primary_keys']) && !empty($viewConfig[$view_name]['primary_keys'])) {
        return (array)$viewConfig[$view_name]['primary_keys'];
    } else {
        error_log('getPrimaryKeysByView: No primary_keys defined for view ' . $view_name);
        // 显示所有可用视图
        error_log('getPrimaryKeysByView: Available views: ' . implode(', ', array_keys($viewConfig)));
    }
    
    // 检查配置文件中是否有该视图对应的基本表
    if (isset($viewConfig[$view_name]['base_tables']) && !empty($viewConfig[$view_name]['base_tables'])) {
        $main_table = $viewConfig[$view_name]['base_tables'][0];
        return getTablePrimaryKeys($main_table);
    } else {
        error_log('getPrimaryKeysByView: No base_tables defined for view ' . $view_name);
    }
    
    return array();
}
/**
 * 根据config.php配置获取当前数据库名
 * @return string|null 数据库名，获取失败返回null
 */
function getCurrentDatabaseName() {
    // 引入配置文件
    global $db_configs;
    if (!isset($db_configs) || !isset($db_configs[DEFAULT_CONFIG_ID])) {
        return null;
    }
    $default_config = $db_configs[DEFAULT_CONFIG_ID];
    return isset($default_config['dbname']) ? $default_config['dbname'] : null;
}
/**
 * 获取数据库中所有基本表的名称
 * @return array 基本表名称数组
 */
function getAllTables() {
    $conn = getDbConnection();
    if (!$conn) {
        return array();
    }
    
    // 查询所有基本表（非视图）
    $sql = "SHOW FULL TABLES WHERE table_type = 'BASE TABLE'";
    $result = $conn->query($sql);
    
    $tables = array();
    if ($result && $result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            // 提取表名称（数组中的第一个值）
            $tables[] = reset($row);
        }
    }
    
    $conn->close();
    return $tables;
}

// 从数据库字段comment中获取中文字段名
function getChineseFieldName($field_name, $table_name) {
     $conn = getDbConnection();
    
    // 安全转义表名和字段名
    $safe_table_name = $conn->real_escape_string($table_name);
    $safe_field_name = $conn->real_escape_string($field_name);
    
    // 首先尝试从数据库获取字段的comment
    $sql = "SELECT COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '$safe_table_name' AND COLUMN_NAME = '$safe_field_name'";
    $result = $conn->query($sql);
    
    if ($result && $result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $comment = $row['COLUMN_COMMENT'];
        
        // 如果comment不为空，则返回comment
        if (!empty($comment)) {
            return $comment;
        }
    }
    
    // 如果没有comment或查询失败，则返回原字段名
    return $field_name;
}

?>